<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.css" rel="stylesheet">
</head>
<body>
  <div id="app">
    商品名称：
    <input type="text" v-model="item.name">
    商品价格
    <input type="number" v-model="item.number">
    商品购买数量
    <input type="number" v-model="item.price">
    <button @click="addCart">增加到购物车</button>
    <table class="table table-bordered" style="width: 600px;margin: 20px auto;">
      <thead>
        <tr>
          <th>商品名字</th>
          <th>商品价格</th>
          <th>商品数量</th>
          <th>小计</th>
          <td>操作</td>
        </tr>
      </thead>
      <tbody>
        <tr v-if="this.items.length === 0">
          <td colspan="5" align="center">
            暂无商品
          </td>
        </tr>
        <tr v-for="(item,index) in items" :key="index">
          <td>
            <input type="checkbox" v-model="item.checked" @change="itemCheckedChange">
            {{item.name}}
          </td>
          <td>
            {{ item.price }}
          </td>
          <td>
            <button class="btn btn-xs" @click="reduceNum(index)">-</button>
            {{ item.number }}
            <button class="btn btn-xs" @click="addNum(index)">+</button>
          </td>
          <td>
            {{ (item.price*item.number).toFixed(2)}}
          </td>
          <td>
            <button class="btn btn-danger" @click="delItem(index)">删除</button>
          </td>
        </tr>
      </tbody>
      <tfoot>
        <tr>
          <td>合计:</td>
          <td colspan="4">
            全选: <input type="checkbox" @change="allCheckedChange" v-model="allChecked">
            总价格:{{total}}
          </td>
        </tr>
      </tfoot>
    </table>
  </div>
  <script src="./vue.js"></script>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        item: {
          name: '',
          price:0,
          number: 1
        },
        items: [
          {
            name: '商品1',
            // 商品选中状态
            checked: false,
            price: 16.8,
            number: 2
          },
          {
            name: '商品2',
            // 商品选中状态
            checked: true,
            price: 199.8,
            number: 1
          },
          {
            name: '商品3',
            // 商品选中状态
            checked: true,
            price: 288.88,
            number: 1
          },
          {
            name: '商品4',
            // 商品选中状态
            checked: true,
            price: 166.8,
            number: 1
          }
        ],
        // 总价格 初始 计算得到
        total: 0,
        // 商品是不是全部选中 需要计算得到
        allChecked: true
      },
      methods: {
        addCart(){
          // 加入到购物车中
          
          this.items.push({
            ...this.item,
            checked: true
          });
        },
        allCheckedChange(){
          // 点击全选 改变全选状态
          // 将所有的商品checked变成全选状态即可
          this.items.forEach(item => {
            item.checked = this.allChecked;
          })
          // 重新计算总价格
          this.calcTotal();
        },
        itemCheckedChange(){
          // 商品选中状态发生改变
          // 重新计算总价格和全选状态即可
          this.calcTotal();
          this.setAllChecked();
        },
        delItem(index){
          if(confirm('您确认删除吗?')){
            this.items.splice(index, 1);
            // 重新计算总价格
            this.calcTotal();
          }
        },
        reduceNum(index){
          // 减少购买数量
          // 打断点
         
          this.items[index].number--;
          // 判断购买数量是否小于1
          if(this.items[index].number < 1) {
            this.items[index].number = 1;
          }
          this.calcTotal();
        },
        addNum(index){
          // 点击 增加购买数量
          this.items[index].number++;
          // 重新计算总价格
          this.calcTotal();
        },
        calcTotal(){
          // 封装计算总价格的函数
          /* 
            所有的选中商品的单价*数量的总合
           */
          //  1去除未选中商品 过滤  filter
          const checkedItems = this.items.filter(item => item.checked);
          // 累加
          this.total = 0;
          checkedItems.forEach(item => {
            this.total += item.price*item.number;
          })
          // 保留两位小数点
          this.total = this.total.toFixed(2);
        },
        setAllChecked(){
          /* 
            全选 取决于 所有商品都是选中的
            所有的商品 如果checked属性都为true则 全选未true,否则未false
           */
           this.allChecked = this.items.every(item=>item.checked);
        }
      }
    })
    // 实例初始化完成调用 计算总价格
    vm.calcTotal();
    // 初始化调用 设置全选状态
    vm.setAllChecked();
  </script>
</body>
</html>